package com.geek.log4jcontrol.proxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import com.geek.log4jcontrol.core.OperateRecordControler;
import com.geek.log4jcontrol.core.PermissionChecker;

/**
 * @package com.geek.log4jcontrol.proxy
 * @description RMI接口实现的代理
 * @author Goliath
 * @createTime 2012-8-3 上午09:56:11
 * @modifyTime
 */
@SuppressWarnings("unchecked")
public class RemoteProxyCglib implements MethodInterceptor {

	private Enhancer enhancer = new Enhancer();
	/**
	 * @description IP和操作码的校验
	 */
	private PermissionChecker permissionChecker = PermissionChecker.getInstance();
	/**
	 * @description Logj4本身的操作记录
	 */
	private OperateRecordControler operateRecordControler = OperateRecordControler.getInstance();

	/**
	 * @package com.geek.log4jcontrol.proxy
	 * @description 通过cglib的字节码处理获得代理对象
	 * @param clazz 需要代理的类
	 * @return cglib的代理对象
	 * @returnType Object
	 * @author Goliath
	 * @createTime 2012-8-3 上午10:28:55
	 * @modifyTime
	 */
	public Object getProxy(Class clazz) {
		enhancer.setSuperclass(clazz);
		enhancer.setCallback(this);
		return enhancer.create();
	}

	/* (non-Javadoc)
	 * @see net.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], net.sf.cglib.proxy.MethodProxy)
	 */
	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
		Object returnObj = null;
		before(arg0, arg1, arg2);
		returnObj = arg3.invokeSuper(arg0, arg2);
		after(arg0, arg1, arg2, returnObj);
		return returnObj;
	}

	/**
	 * @package com.geek.log4jcontrol.proxy
	 * @description 接口方法执行前操作
	 * @param arg0 代理对象
	 * @param arg1 操作方法
	 * @param arg2 方法参数
	 * @return 接口方法执行前操作结果
	 * @returnType int
	 * @author Goliath
	 * @createTime 2012-8-3 上午10:29:53
	 * @modifyTime
	 */
	public int before(Object arg0, Method arg1, Object[] arg2) {
		System.out.println("--------校验操作权限----------");
		return permissionChecker.checkPermissions(arg0, arg2, arg1);
	}

	/**
	 * @package com.geek.log4jcontrol.proxy
	 * @description 接口方法执行后操作
	 * @param arg0 代理对象
	 * @param arg1 操作方法
	 * @param arg2 方法参数
	 * @return 接口方法执行后操作结果
	 * @returnType int
	 * @author Goliath
	 * @param returnObj 
	 * @createTime 2012-8-3 上午10:31:33
	 * @modifyTime
	 */
	public int after(Object arg0, Method arg1, Object[] arg2, Object returnObj) {
		System.out.println("--------操作成功后 记录操作日志----------");
		return operateRecordControler.addOperateRecord();
	}

}
